' Written by Craig'n'Dave
Module Module1
    ' Circular queue using an array
    Public Class Queue
        Private max As Integer = 10
        Private items(max) As String

        Private front_pointer As Integer = -1
        Private back_pointer As Integer = -1

        Function enqueue(item As String)
            ' Check queue overflow
            If (back_pointer + 1) Mod max <> front_pointer Then
                back_pointer = (back_pointer + 1) Mod max
                ' Enqueue the item
                items(back_pointer) = item
                ' Set first item if queue was empty
                If front_pointer = -1 Then
                    front_pointer = 0
                End If
                Return True
            Else
                Return False
            End If
        End Function

        Function dequeue()
            ' Check queue underflow
            If front_pointer <> -1 Then
                ' Dequeue the item
                Dim item As String = items(front_pointer)
                ' If the queue is not empty change the front pointer
                If front_pointer <> back_pointer Then
                    front_pointer = (front_pointer + 1) Mod max
                Else
                    ' When the last item is dequeued reset the pointers
                    front_pointer = -1
                    back_pointer = -1
                End If
                Return item
            Else
                Return Nothing
            End If
        End Function

        Function peek()
            ' Check queue underflow
            If front_pointer <> -1 Then
                ' Peek the item
                Return items(front_pointer)
            Else
                Return Nothing
            End If
        End Function
    End Class

    ' Main program starts here
    Sub Main()
        Dim items() As String = {"Florida", "Georgia", "Delaware", "Alabama", "California"}
        Dim q As New Queue
        ' Add items to the queue
        For index = 0 To items.Length - 1
            q.enqueue(items(index))
        Next
        'Remove items from the queue
        Console.WriteLine(q.dequeue)
        ' Output the next item in the queue
        Console.WriteLine(q.peek)
    End Sub
End Module